// pages/cart/index.js
// 1 获取用户的收货地址
//   1 绑定点击事件
//   2 调用小程序内置 api 获取用户所在地址
// 2 获取用户对小程序 所授予 获取地址的 权限 状态 Scope
//   1 假设 用户 点击获取收获地址的提示框 点击的确定 authSetting scope.address
//     scope 值 true
    // 2 假设 用户 点击获取收获地址的提示框 取消
    //   scope 值 false
        // 3 假设用户从来没有调用过 收货地址API
        //   scope 值 undefined
        // 4 把获取到的收货地址 存入到 本地存储中
  // 2 页面加载完毕
            // 0 onLoad  onShow
        // 1 过去本地存储中的地址数据
            // 2 把数据 设置给data中的一个变量
  // 3 onShow
    // 0 回到了商品详情页面 第一次添加商品的时候 手动添加了属性
        // 1 num = 1;
        // 2 checked = true
    // 1 获取缓存中的购物车数组
    // 2 把购物车数据填充到data中
    // 4 全选的实现 数据的展示
      // 1 onShow 过去缓存中的购物车数组
        // 2 根据购物车中的商品数据 所有的商品都被选中 checked = true 全选就被选中
    // 5 总价格和总数量
      // 1 都需要商品被选中 我们才能拿他来计算
      // 2 获取购物车数组
      // 3 遍历
      // 4 判断商品是否被选中
      // 5 总价格 += 商品的单价 * 商品的数量
      // 6 吧计算后的价格和数量 设置会 data中 
    // 6 商品的选中
      // 1 绑定change事件
      // 2 获取到被修改的商品对象
      // 3 商品对象的选中状态 取反
      // 4 重新填充会data中和缓存中
      // 5 重新计算全选。 总价格 总数量
    // 7 全选和反选
      // 1 全选复选框绑定事件 change
      // 2 获取data中的全选变量 allChecked
      // 3 直接取反 allChecked = ！allChecked
      // 4 便利购物车数组 让里面 商品 选中状态跟随 allChecked 改变
      // 5 把购物车数组 和 allChecked 重新 设置会data中 把购物车重新设置会缓存中
    // 8 商品数量的编辑
      // 1 + - 按钮 绑定同一个点击事件
        // 1 +1
        // 2 -1
      // 2 传递 被点击的商品id goods_id
      // 3 获取data中的购物车数组 来获取需要被修改的商品对象
      // 4 直接修改商品对象的数量 num
      // 5 吧 cart数组重新设置会 缓存中 和data中 this.setCart
      // 6 当购物车的数量 =1 同时 用户 点击 "-"
        // 弹窗提示 询问用户 是否要删除
          // 1 确定 直接执行删除
          // 2 取消 什么都不做 

  import {getSetting,chooseAddress,openSetting,showModal,showToast} from "../../utils/asyncwx.js";
  import regeneratorRuntime from '../../lib/runtime/runtime';
Page({
  data:{
    address:{},
    cart:[],
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  onShow(){
    // 1 获取缓存中的收货地址信息
    const address = wx.getStorageSync("address");
    // 1 获取缓存中的购物车数据
    const cart = wx.getStorageSync("cart")||[];
    
    // 1 计算全选
    // every 数组方法 会便利 会接收一个回调函数 那么 每一个回调函数都返回true 那么 every方法的返回值为true
    // 只要有一个回调函数返回false 那么不在循环执行，直接返回false
    // 空数组 调用 every,返回值就是true
    // const allChecked = cart.length?cart.every(v=>v.checked):false
    // let allChecked = true;
    // 1 总价格 总数量
    // let totalPrice = 0;
    // let totalNum = 0;
    // cart.forEach(v => {
    //   if(v.checked){
    //     totalPrice+=v.num*v.goods_price;
    //     totalNum+= v.num;
    //   }else{
    //     allChecked = false
    //   }
    // });
    // 判断数组是否为空
    // allChecked = cart.length!=0?allChecked :false;
    // 2 给data 赋值
    // this.setData({
    //   address,
    //   cart,
    //   allChecked,
    //   totalPrice,
    //   totalNum
    // })
    // console.log(wx.getStorageSync("address"))
    
    this.setData({
      address
    })
    this.setCart(cart);
  },
  //点击收货地址
  async handleChooseAddress(){
    // 2 获取收获地址
    // wx.chooseAddress({
    //   success: (result)=>{
    //     console.log(result);
        
    //   },
    // });
// 1.获取权限状态
    // wx.getSetting({
    //   success: (result)=>{
    //     // console.log(result);
    //     const scopeAddress = result.authSetting["scope.address"];
    //     if(scopeAddress === true||scopeAddress === undefined){
    //       wx.chooseAddress({
    //         success: (result1)=>{
    //           console.log(result1);
              
    //         },
    //       });
    //     }else{
    //       //3 用户曾经拒绝过授权 诱导用户打开授权页面
    //       wx.openSetting({
    //         success: (result2)=>{
    //           // 4 可以调用 收获地址代码
    //           wx.chooseAddress({
    //             success: (result3)=>{
    //               console.log(result3);
                  
    //             },
    //           });
    //         },
    //       });
    //     }
        
    //   },
    // });
try {
      //1 获取权限状态
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      //2判断 权限状态
      if(scopeAddress === true || scopeAddress === undefined){
        //3 调用获取收获地址的 API 
        let address = await chooseAddress();
        address.all = address.provinceName+address.cityName+address.countyName+address.detailInfo;
        // console.log(res2)
        wx.setStorageSync("address", address);
      }else{
        //3 诱导用户打开授权页面
        await openSetting();
        // 4 调用收货地址的API
        let address = await chooseAddress();
        address.all = address.provinceName+address.cityName+address.countyName+address.detailInfo;
        // 5 存入到缓存中
       wx.setStorageSync("address", address);
      }
} catch (error) {
  console.log(error)
}
    
  },
  // 商品的选中
  handleItemChange(e){
    // 获取被修改的商品id
    // console.log(e)
    const goods_id = e.currentTarget.dataset.id;
    // 2 获取购物车数组
    let {cart} = this.data;
    // 3 找到被修改的商品对象
    let index = cart.findIndex(v=>v.goods_id === goods_id);
    // 4 取反
    cart[index].checked=!cart[index].checked;

   this.setCart(cart)
  },
  // 设置购物车状态同时 重新结算 底部工具栏的全部数据 全选 总价格 购买数量
  setCart(cart){
    let allChecked = true;
    // 1 总价格 总数量
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(v => {
      if(v.checked){
        totalPrice+=v.num*v.goods_price;
        totalNum+= v.num;
      }else{
        allChecked = false
      }
    });
    // 判断数组是否为空
    allChecked = cart.length!=0?allChecked :false;
    this.setData({
      cart,
      totalNum,
      totalPrice,
      allChecked
    });
    wx.setStorageSync("cart", cart);
  },
  // 商品的全选功能
  handleItemAllCheck(){
    // 1 获取data中的数据
    let {cart,allChecked} = this.data;
    // 2 修改之
    allChecked =!allChecked;
    // 3 循环修改cart数组中的商品选中状态
    cart.forEach(v =>v.checked = allChecked);
    // 4 吧修改后的值全部 填充回 data 和缓存中
    this.setCart(cart);
  },
  // 商品数量的编辑功能
   async handleItemEdit(e){
    // 1 获取传递过来的参数
    const {operation,id} = e.currentTarget.dataset;
    // 2 获取购物车数组
    let {cart} =this.data;
    // 3 找到需要修改的商品的索引
    const index = cart.findIndex(v=>v.goods_id === id);
    // 判断是否执行删除
    if(cart[index].num === 1&& operation === -1){
      //弹窗提示
      const res = await showModal({content: '你是否要删除呢？'})
      if(res.confirm){
        cart.splice(index,1);
        this.setCart(cart)
      }
    }else{
    // 4 进行修改数量
    cart[index].num+=operation;
    // 5 设置回缓存和data中
    this.setCart(cart);
    }

  },
  // 点击结算功能
  async handlePay(){
    // 1判断收货地址
    const {address,totalNum} = this.data;
    if(!address.userName){
      await showToast({title:"您还没有选择收货地址"});
      return;
    }
    // 判断用户有没有选购商品
    if(totalNum === 0){
      await showToast({title:"您还没有选购商品"});
      return;
    }
    // 跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    });
  }
})